#ifndef __ALTAIR_APPINIT_H__
#define __ALTAIR_APPINIT_H__

/**
 *  pri startu kazde aplikace...
 */

#include <altair/string/far2char.h>
#include <altair/system/env.h>
#include <string/strcpy.h>
#include <stdlib/malloc.h>
#include <unistd/getcwd.h>
#include <unistd/chdir.h>
#include <types.h>

extern main(int argc, char **argv);

/**
 *  a_init()
 *  provede absolutni inicializaci potrebnou pro externi aplikace
 *
 *  a_szCurrentPath           - v teto promenne je string, ktery znaci aktualni slozku
 *  a_szArguments             - string, parametry k aplikaci
 */
void a_init() {
  char **argv        = malloc(sizeof(char *) * 16); /* alokujeme pamet pro ukazatele na jednotlive parametry */
  char *arguments    = malloc(128);                 /* alokujeme pamet pro parametry k aplikacim */
  char *appname      = malloc(16);                  /* alokujeme pamet pro nazev aktualniho programu */
  int  arguments_pos = 0;                           /* promenna, ktera udava n-ty znak v retezci <arguments> */
  int  argc          = 0;                           /* pocet parametru */
  char *dir;
  dir                = malloc(128);                 /* alokace pameti pro retezec obsahujici aktualni slozku */
  chdir(a_getCurrpath(dir));                        /* nejprve vsak skocime do slozky, ze ktere byla aplikace spustena */
  /* funkce */
  a_getAppName(appname);                            /* zjistime nazev aplikace */
  a_getArgs(arguments);                             /* zjistime vsechny parametry */
  argv[argc++] = appname;                           /* nulty parametr == nazev aplikace, pocet parametru zvysime o jeden */

  if(*arguments) {                                  /* pokud jsou nejake parametry... */
    argv[argc++] = arguments;                       /* jako prvni asociuj */

    while(arguments[arguments_pos]) {               /* projed cely retezec... */
      if(arguments[arguments_pos] == ' ') {         /* pokud narazime na mezeru, tokenizujeme */
        arguments[arguments_pos] = '\0';            /* ukocime retezec */
        argv[argc++] = ((arguments + arguments_pos) + 1); /* a pricteme parametr */
      }
      arguments_pos++;                              /* inkrementujeme pozici v retezci parametru */
    }
  }

  /* zavolame hlavni funkci aplikace */
  *a_iReturnValue = main(argc, argv);
  return;
}

#endif
